Summary

501 C(3) Nonprofits in a Decade


  • The number of registered nonprofits reached its highest point in 2017 but have been decreasing since then.

  • 501 c(3) Public charities counted for a great percentage of all nonprofits

  • Private foundations changed at a lower magnitude compared to private foundations

  • The nonprofit sector is heavily impacted by the domestic economic market

\(\textbf{Source:}\) IRS Business Master File 2002, 2012, 2017, 2022

Financial Information by Type


  • In the year of 2019, public charities had the most assets, spend the most, and returned the most revenues among all nonprofits.

  • All nonprofits, on average, were profitable this year, calculated as \(\text{Revenue - Expense}\).

  • Private foundations were more profitable than public charities, considering private foundations represented a much smaller share than public foundations, whereas, the gaps in expense and revenues (PF is 4ish times smaller than PC) are not as great as the size differences (PF is 10 times smaller than PC)

Source: NCCS Core File 2019

Outside NCCS Scope


  • Public charity has the most organizations out of NCCS scope.

  • Regardless of the type, the proportion of nonprofits outside the scope is very very small that these organizations are neglectable.

Public Charity in 2019

Number of PCs by Expense Level


  • Most PC organizations fell under the low-spending end of the spectrum

  • The distribution is highly right-skewed

PC Financial Informaiton by by Expense Level


  • Organizations who spent 10 million or more also earned significantly more than public charities who made fewer than 10 million.

Number of PCs by Category


  • Human services and other public/social services are the absolute majorities here.

PC Finance Information by Category


  • Education and Healthcare are two big parts!

Private Foundation in 2019

Number of PFs by State


  • NY, CA, and FL have the most private foundation-type nonprofits.

PF Finance Information by State


  • CA-based Private Foundations gained more total revenues than NY, despite the latter has more organizations than the former

  • PFs based in CA and NY exceed than their counterparts in other states on both total expense and total revenue

Number of PFs by Category


  • There are an incredible amount of PFs under category “Other social and health benefits”

PF Finance Information by Category


  • Category “Other public and social benefits” are excluded due to its extraordinarily large number

Volunteering and Giving

Column

Volunteer Activities

Value of Volunteering

2008 2009 2010 2011 2012 2013 2014 2015 2016 2017
Per year
Percent of population volunteering 26.4 26.8 26.3 26.8 26.5 25.4 25.3 24.9 25.2 25.1
Number of volunteers (millions) 61.8 63.4 62.8 64.3 64.5 62.6 62.8 62.6 63.9 64.4
Hours volunteered (billions) 8 8.1 8.1 8.5 8.5 8.3 8.7 8.5 8.7 8.8
Average hours per volunteer 130 128 129 132 132 133 139 136 136 137
Median hours per volunteer 52 52 52 51 50 50 50 52
Per average day
Percent of population volunteering 6.8 7.1 6.8 6 5.8 6.1 6.4 6.4 5.6 6
Number of volunteers (millions) 16.2 17.1 16.6 14.6 14.3 15.1 16 16.3 14.4 15.6
Hours per day per volunteer 2.43 2.39 2.46 2.84 2.48 2.57 2.41 2.49 2.39 2.86
Value of volunteers
Population age 16 and over (millions) 234.4 236.3 238.3 240 243.8 246.2 248.4 251.3 253.6 256
Full-time-equivalent employees (millions) 4.7 4.8 4.8 5 5 4.9 5.1 5 5.1 5.2
Assigned hourly wages for volunteers $18.08 $18.63 $19.07 $19.47 $19.75 $20.16 $20.59 $21.08 $21.63 $22.13
Assigned value of volunteer time ($ billions) $144.70 $150.70 $154.10 $164.80 $168.30 $167.20 $179.20 $179.00 $187.40 $195.00

Column

Giving Amount

Giving by Charity Type

Total Grants

Density Map

Column

2019 All 501c(3) Nonprofits

Column

2019 Public Charities

2019 Private Foundations

---
title: "Nonprofit Sector In Brief Dashboard"
output: 
  flexdashboard::flex_dashboard:
    logo: Resized_Urban_Logo.png
    social: menu
    source_code: embed
    theme: cerulean
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, 
                      message = FALSE, 
                      warning =FALSE)
```

```{r, include=FALSE}
library(flexdashboard)
library(htmlwidgets)
library(DT)

library(httr)
library(tidyverse)
library(stringr)
library(RCurl)
library(reshape2)
library(RColorBrewer)
library(extrafont)
library(knitr)
library(foreign)
library(kableExtra)
library(urbnthemes)
library(grid)
library(gridExtra)
library(rmarkdown)
library(plotly)
library(sf) 
library(sp)
library(ggmap)
library(leaflet)
#library(highcharter)

set_urbn_defaults()
```



Summary {.storyboard}
=======================================================================

```{r, echo=F}
Nonprofit_trend <- 
  read_csv("Data/Output_Data/Number_nonprofit_trend.csv") %>%
  select(!1)

Nonprofit_trend$Year = as.character(Nonprofit_trend$Year)
```

### 501 C(3) Nonprofits in a Decade
```{r}
p_trend <- Nonprofit_trend %>%
  ggplot(aes(x = as.factor(Year), 
             group=1)) +
  geom_line(aes(y = `All registered nonprofits`), 
            color = "#00CCFF") +
  geom_point(aes(y = `All registered nonprofits`), 
             color = "#00CCFF", size = .8) +
  geom_line(aes(y = `501(c)(3) public charities`), 
            color = "#99FF33") +
  geom_point(aes(y = `501(c)(3) public charities`), 
             color = "#99FF33", 
             size = .8) +
  geom_line(aes(y = `501(c)(3) private foundations`), 
            color = "#FF9933") +
  geom_point(aes(y = `501(c)(3) private foundations`), 
             color = "#FF9933", 
             size = .8) +
  labs(x = "",
       y = "") +
   guides(color = guide_legend(title = " ")) +
  scale_color_discrete(labels = c("All registered nonprofits", 
                                  "501(c)(3) public charities")) +

   theme(legend.position="right", 
         legend.direction = "vertical") +
  theme(axis.line.y = element_blank(),
        axis.ticks = element_blank()) +
  scale_y_continuous(expand = c(0, 0),
                     limits = c(0, 1600000), 
                     breaks = c(0,100000,  seq(500000, 1500000, 250000)))

p_trend <- p_trend + 
  annotate("text", 
           x = 4.2,
           y = 1300000, 
           label = "All nonprofit",
           size = 3.5)
p_trend <- p_trend + 
  annotate("text",
           x = 4.2, 
           y = 1000000, 
           label = "Public charity", 
           size = 3.5)
p_trend <- 
  p_trend + 
  annotate("text",
           x = 4.2,
           y = 150000,
           label = "Private foundation",
           size = 3.5)


ggplotly(p_trend) %>% 
  layout(hoverlabel = list(bgcolor = "white"))
```


***

- The number of registered nonprofits reached its highest point in 2017 but have been decreasing since then. 

- 501 c(3) Public charities counted for a great percentage of all nonprofits 

- Private foundations changed at a lower magnitude compared to private foundations

- The nonprofit sector is heavily impacted by the domestic economic market


$\textbf{Source:}$ IRS Business Master File 2002, 2012, 2017, 2022


### Financial Information by Type

```{r}
Finance <- read_csv("Data/Output_Data/Nonprofit_finance_2019.csv") %>%
  select(!1)

p_fin <- Finance %>%
  filter(Type  %in% c("PC", "CO", "PF"),
         Variable != "Reporting") %>%
  ggplot(aes(x = Variable, 
             y = Value, 
             fill = Type)) +
  geom_col(position = "dodge") +
#  geom_text(aes(Variable, Value, label=Value),
   #           vjust=-.1, 
 #             position = position_dodge(width=1),
   #           size =3) +
  ylim(NA, 5000) + 
  labs(x = "", 
       y = "")  +
   theme(legend.position="right",
         legend.direction = "vertical") +
  theme(axis.ticks = element_blank(),
          panel.grid.major.x = element_blank(),
          panel.grid.minor.x = element_blank()) +
  scale_y_continuous(expand = c(0, 0),
                     limits = c(0, 2500),
                     breaks = c(0, 100, 500, seq(1000, 2000, 1000)))

ggplotly(p_fin) %>% 
  layout(hoverlabel = list(bgcolor = "white"))
```

***

- In the year of 2019, public charities had the most assets, spend the most, and returned the most revenues among all nonprofits. 

- All nonprofits, on average, were profitable this year, calculated as $\text{Revenue - Expense}$.

- Private foundations were more profitable than public charities, considering private foundations represented a much smaller share than public foundations, whereas, the gaps in expense and revenues (PF is 4ish times smaller than PC) are not as great as the size differences (PF is 10 times smaller than PC)


Source: NCCS Core File 2019

### Outside NCCS Scope

```{r}
inoutnccs <- read_csv("Data/Output_Data/outnccs_19.csv") %>% select(!1)
```

```{r}
p_out <- inoutnccs %>%
  filter(OUTNCCS == "OUT") %>%
  ggplot(aes(x = reorder(factor(type),n), 
             y= n)) +
  geom_bar(stat = "identity", 
           fill = "skyblue1") +
  # geom_text(aes(label = n), 
  #           position= position_dodge(width=1), 
  #             vjust =-.3,
  #             size=3) +
  scale_x_discrete(limits = rev)  +
  labs(x = "", 
       y = "") +
  theme(axis.ticks = element_blank()) +
  scale_y_continuous(expand = c(0, 0),
                     limits = c(0, 3200), 
                     breaks = c(0, 200, seq(1000, 3000, 1000)))

ggplotly(p_out) %>% 
  layout(hoverlabel = list(bgcolor = "white"))
```

***

- Public charity has the most organizations out of NCCS scope.

- Regardless of the type, the proportion of nonprofits outside the scope is very very small that these organizations are neglectable.



Public Charity in 2019 {.storyboard}
=======================================================================

### Number of PCs by Expense Level
```{r}
PC_expense_long <- read_csv("Data/Output_Data/PC2019_by_expense.csv") %>%
  select(!1)  %>%
  mutate(Expense_Group2 = case_when(
      `Expense Group` %in% c("a. Under $100,000", 
                             "b. $100,000 to $499,999",
                             "c. $500,000 to $999,999") ~ "Under 1 million",
      `Expense Group` %in% c("d. $1 million to $4.99 million", 
                             "e. $5 million to $9.99 million") ~ "1 million to 10 million",
      `Expense Group` %in% c("f. $10 million or more") ~ "10 million or more",
      `Expense Group` %in% c("Total Expense") ~ "Total"
  )) %>% 
  pivot_longer(4:7, 
               values_to = "Value", 
               names_to = "Financial_Group")  
```

```{r}
pc2019 <- read_csv("Data/core2019pc.csv") %>%
  select(!1)
```

```{r}
ggplotly(
  pc2019 %>%
    mutate(EXPCAT = factor(EXPCAT)) %>%
    group_by(EXPCAT) %>%
    summarise(n = n()) %>%
    
    ggplot(aes(x = EXPCAT, 
               y = n)) +
    geom_bar(stat = "identity", 
             fill = "cadetblue2") +
 # geom_text(aes(label = n), 
     #       position= position_dodge(width=1), 
       #       hjust = .3, size=3) +
  scale_x_discrete(labels = c("Under 100,000", "100,000 - 499,999", 
                              "500,000 - 999,999", "1 - 4.9 million",
                              "5 - 9.9 million", "10 million or more")) +
  #  scale_x_discrete(labels = function(type) stringr::str_wrap(type, width=10)) +
#  scale_x_discrete(limits = rev)  +
#  ylim(NA, 250000) +
  labs(x = "", 
       y = "") +
  theme(#axis.text.x = element_blank(),
         axis.ticks = element_blank(),
          axis.line.y = element_blank(),
          panel.grid.major.x = element_blank(),
          panel.grid.minor.x = element_blank(),
          #panel.grid.major.x = element_line(color = "gray60", size = 0.8, linetype = "dashed")
          ) + 
  scale_y_continuous(expand = c(0, 0), 
                     limits = c(0, 210000), 
                     breaks = c(0, 25000, seq(50000, 200000, 50000)))) %>% 
  layout(hoverlabel = list(bgcolor = "white"))

```
***

- Most PC organizations fell under the low-spending end of the spectrum

- The distribution is highly right-skewed


### PC Financial Informaiton by by Expense Level
```{r, echo=FALSE}
p_expense <- 
  PC_expense_long %>%
  filter(Financial_Group %in% c("Total Assets", "Total Revenue")) %>%
  ggplot(aes(x = reorder(factor(Expense_Group2), Value), 
             y = Value, 
             fill = Financial_Group)) +
  geom_col(position = "dodge") + 
  labs(x = NULL, 
       y = NULL) +
 # geom_text(aes(label = Value),
 #             position= position_dodge(width=1), vjust =-.1, size=3) +
   theme(axis.ticks = element_blank()) +
   scale_y_continuous(expand = c(0, 0), 
                      limits = c(0, 5000),
                      breaks = c(0, 200, seq(1000, 4000, 1000))) +
   theme(legend.position="right", 
         legend.direction = "vertical") 
 

ggplotly(p_expense) %>% 
  layout(legend = list(orientation = "h",
                       x = 0.15, 
                       y = -0.1), 
         hoverlabel = list(bgcolor = "white")) 
```

***

- Organizations who spent 10 million or more also earned significantly more than public charities who made fewer than 10 million.


### Number of PCs by Category

```{r}
ggplotly(
  pc2019 %>%
    mutate(NTEEGRP = factor(NTEEGRP)) %>%
    group_by(NTEEGRP) %>%
    summarise(n = n()) %>%
    
    ggplot(aes(x = reorder(NTEEGRP,n), 
               y = n)) +
    geom_bar(stat = "identity",
    fill = "cadetblue2") +
#  geom_text(aes(label = n), 
 #           position= position_dodge(width=1), 
  #            hjust = 3,
  #            size=3) +
#  scale_x_discrete(limits = rev)  +
  labs(x = "",
       y = "") +
  theme(#axis.text.x = element_blank(),
          axis.line = element_blank(),
          axis.ticks.y = element_blank(),
          panel.grid.major.y = element_blank(),
          panel.grid.minor.y = element_blank(),
          panel.grid.major.x = element_line(color = "gray60", 
                                            size = 0.8,
                                            linetype = "dashed")
          ) + 
  scale_y_continuous(expand = c(0, 0), 
                     limits = c(0, 150000), 
                     breaks = c(0, 10000, seq(25000, 125000, 25000))) +
   coord_flip()
) %>% 
  layout(hoverlabel = list(bgcolor = "white"))

```

***

- Human services and other public/social services are the absolute majorities here.


### PC Finance Information by Category
```{r}
PC_category <-
  read_csv("Data/Output_Data/PC2019_by_category.csv") %>%
  select(!1)

PC_category_long <- PC_category %>%
  pivot_longer(4:7, 
               values_to = "Value",
               names_to = "NTEE_Group") %>%
  select(Category, NTEE_Group, Value)

p_category <- 
  PC_category_long %>%
  filter(NTEE_Group %in% c("Total Expenses", "Total Revenue")) %>% 
  ggplot(aes(x = reorder(Category, Value),
             y = Value,
             fill = NTEE_Group)) +
  geom_bar(position = "dodge", 
           stat = "identity") + 
  labs(x = NULL, 
       y = NULL) +
  coord_flip() +
 # geom_vline(xintercept = seq(0, 3000, 500), linetype="dotted") +
#  geom_text(data = PC_category_long %>% mutate(Category = reorder(Category, Value)) %>% #slice(1:2, 7:12, 13:18), aes(label = formatC(round(Value,2), format = 'f', digits =2)),
#              position= position_dodge(width=1), hjust =-.1, size=3) + 
  theme( panel.grid.major.x = element_line(color = "gray60", 
                                           size = 0.8, 
                                           linetype = "dashed") ) +
   scale_y_continuous(expand = c(0, 0), 
                      limits = c(0, 2600), 
                      breaks = c(0,100, 250, seq(500, 2500, 500)))  +
 theme(
   axis.line.x = element_blank(),
    panel.grid.major.y = element_blank(),
#    panel.grid.minor.y = element_blank()
  ) +
   theme(legend.position="right", 
         legend.direction = "vertical")
#  scale_x_discrete(limits = rev) 
     

ggplotly(p_category) %>% 
  layout(legend = list(orientation = "h",
                       x = 0.15, 
                       y = -0.1),
         hoverlabel = list(bgcolor = "white")) 
```

***

- Education and Healthcare are two big parts!




Private Foundation in 2019 {.storyboard}
=======================================================================

### Number of PFs by State

```{r, include=F}

pf19_state <- read_csv("Data/Output_Data/PF2019_by_state.csv") %>%
  select(!1)
```

```{r}
p_state_size <-
  pf19_state %>%
    mutate(STATE = factor(STATE)) %>%
    mutate(STATE = reorder(STATE, Number)) %>%
    arrange(-Number) %>%
    head(20) %>%
    ggplot(aes(y = Number, 
               x = STATE))+
    geom_bar(stat="identity",
             width = .8, 
             fill="palegreen3") + #lightgreen
    labs(x = "", y = "") +
    theme(#axis.text.x = element_blank(),
        # axis.ticks.x = element_blank(),
          axis.line.x = element_blank(),
          panel.grid.major.y = element_blank(),
          panel.grid.minor.y = element_blank(),
          panel.grid.major.x = element_line(color = "gray60", 
                                            size = 0.8, 
                                            linetype = "dashed")
          ) + 
    scale_y_continuous(expand = c(0, 0), 
                       limits = c(0, 9000), 
                       breaks = c(0, 1000, seq(2000, 8000, 1000)))  +
   coord_flip() 
#    geom_text(aes(label = Number),
      #        position= position_dodge(width=1), hjust =-.2, size=3)
#p_state_size
ggplotly(p_state_size) %>% 
  layout(hoverlabel = list(bgcolor = "white"))
```

***

- NY, CA, and FL have the most private foundation-type nonprofits.

### PF Finance Information by State

```{r}
ggplotly(
  pf19_state %>%
    mutate(STATE = factor(STATE)) %>%
    mutate(STATE = reorder(STATE, Number)) %>%
    arrange(-Number) %>%
    head(5) %>%
    select(!c(2,4)) %>%
    pivot_longer(2:3, 
                 values_to = "Amount", 
                 names_to = "Finance") %>%
    ggplot(aes(y = Amount,
               x = STATE, 
               fill = Finance))+
    geom_bar(position = "dodge", 
             stat="identity", 
             width = .9) +
    labs(x = "", y = "") +
    theme(#axis.text.y = element_blank(),
          axis.ticks.x = element_blank(),
       #  axis.ticks.y = element_blank(),
     #     panel.grid.major.y = element_blank(),
         # panel.grid.minor.y = element_blank(),
          panel.grid.major.x = element_blank(),
          panel.grid.minor.x = element_blank()
          ) + 
    scale_y_continuous(expand = c(0, 0), 
                       limits = c(0, 16), 
                       breaks = c(0,2,5,10,15))  +
  #  geom_text(aes(label = Amount),
   #           position= position_dodge(width=1), vjust =-.1, size=3) +
   scale_x_discrete(limits = rev)  +
    theme(legend.position="right", 
          legend.direction = "vertical") 
 
)  %>%
   layout(legend = list(orientation = "h", 
                        x = 0.12, 
                        y = -0.15), 
          hoverlabel = list(bgcolor = "white"))


```

***

- CA-based Private Foundations gained more total revenues than NY, despite the latter has more organizations than the former

- PFs based in CA and NY exceed than their counterparts in other states on both total expense and total revenue


### Number of PFs by Category

```{r}
pf19_category <- 
  read_csv("Data/Output_Data/PF2019_by_category.csv") %>%
  select(!1)

ggplotly(
  pf19_category %>%
    mutate(NTEEGRP = factor(NTEEGRP)) %>%
    mutate(NTEEGRP = reorder(NTEEGRP,
                             Number)) %>%
  #  arrange(-Number) %>%
 #   head(25) %>%
    ggplot(aes(y = Number, x = NTEEGRP))+
    geom_bar(stat="identity", 
             width = .9,
             fill ="palegreen3") +
    labs(x = "", y = "") +
    theme(#axis.text.x = element_blank(),
        # axis.ticks.x = element_blank(),
          axis.line = element_blank(),
          panel.grid.major.y = element_blank(),
          panel.grid.minor.y = element_blank(),
          panel.grid.major.x = element_line(color = "gray60", size = 0.8, linetype = "dashed")
          ) + 
   coord_flip() +
   scale_y_continuous(expand = c(0, 0), 
                      limits = c(0, 60000), 
                       breaks = c(0, 1000, 5000, 10000, 50000)) # +
   # geom_text(aes(label = formatC(Number, format = 'f', digits =2)),
   #           position= position_dodge(width=1), hjust =-.2, size=3)
) %>% 
  layout(hoverlabel = list(bgcolor = "white"))
```

***

- There are an incredible amount of PFs under category "Other social and health benefits"



### PF Finance Information by Category

```{r}

p19_category  <- pf19_category %>%
 #   mutate(NTEEGRP = factor(NTEEGRP)) %>%
    mutate(NTEEGRP = reorder(factor(NTEEGRP), Number)) %>%
    filter(NTEEGRP != "Other public and social benefit") %>%
    select(!c(2,4)) %>%
    pivot_longer(2:3, 
                 values_to = "Amount", 
                 names_to = "Finance") %>%
    ggplot(aes(y = Amount, 
               x = NTEEGRP, 
               fill = Finance))+
    geom_bar(position = "dodge", 
             stat="identity", 
             width = .9) +
    labs(x = "", 
         y = "") +
    theme(
          axis.line = element_blank(),
     #   axis.text.x = element_blank(),
      #   axis.ticks.y = element_blank(),
         axis.ticks.x = element_blank(),
          panel.grid.major.y = element_blank(),
          panel.grid.minor.y = element_blank(),
          panel.grid.major.x = element_line(color = "gray60", size = 0.8, 
                                            linetype = "dashed")
       #   panel.grid.major.x = element_blank(),
     #     panel.grid.minor.x = element_blank()
          ) + 
    scale_y_continuous(expand = c(0, 0), 
                       limits = c(0, 6), 
                       breaks = c(0, 0.5, seq(1,6,1)))  +
   coord_flip() +
 #   geom_text(aes(label = Amount),
   #          position= position_dodge(width=1), hjust =-.1, size=3) +
  # scale_x_discrete(limits = rev)  +
    theme(legend.position="right", 
          legend.direction = "vertical")
  
#%>%
  # layout(legend = list(orientation = "h", x = 0.15, y = -0.1))

ggplotly(p19_category) %>% 
  layout(hoverlabel = list(bgcolor = "white"))
```

*** 

- Category "Other public and social benefits" are excluded due to its extraordinarily large number


Volunteering and Giving
=======================================================================

Column {.tabset data-width=500}
-----------------------------------------------------------------------

### Volunteer Activities 
```{r}
volunteer_act <- 
  read_csv("Data/External_Data/NSiB_Figure4_Table.csv") %>%
  select(!1)
```

```{r}
ggplotly(
volunteer_act %>%
    filter(type != "Total") %>%
    #filter(type != "Security procedures") %>% #Filtered out because equals 0%
    ggplot(aes(x=reorder(type, -AsPct), 
               y =AsPct)) +
    geom_bar(stat = "identity", 
             fill = "#BF87B3") +

    scale_y_continuous(expand = c(0, 0), 
                       limits = c(0,30)) +
    labs(y = "Percent of total volunteer time") +
  theme(#axis.text.y = element_blank(),
          axis.title = element_blank(),
          axis.ticks.x = element_blank(),
          panel.grid.major.x = element_blank(),
          panel.grid.minor.x = element_blank()
          ) + 
    scale_y_continuous(expand = c(0, 0), limits = c(0, 26), 
                       breaks = c(0,1,5,10,20, 25))  +
    scale_x_discrete(labels = function(type) str_wrap(type, width=10))
) %>% layout(hoverlabel = list(bgcolor = "white"))
```

### Value of Volunteering
```{r}
volunteer_val <- read_csv("Data/External_Data/Volunteering Data.csv")
names(volunteer_val)[1] = ""

for (i in 1:15) {   # change NA to ""
  for (j in 2:11) {
    if (i %in% c(1, 7, 11)) {
      volunteer_val[i,j] <- ""
    }
  }
} 

#reactable::reactable(volunteer_val)
#datatable(volunteer_val, extensions = c('FixedHeader'),rownames = FALSE , 
#          options = list(dom='Bfrtip',autoWidth = TRUE, pageLength=15, buttons=c('print', #'csv', 'pdf'), fixedHeader =TRUE)) %>%
#formatStyle(NA,  color = 'black', fontWeight = 'bold')

kable(volunteer_val,  
      "html", 
      format.args = list(decimal.mark = '.', 
                         big.mark = ","),
      align = "lcccccccccc",
      col.names = 
        c("", "2008", "2009", "2010", "2011", "2012", "2013", 
          "2014", "2015", "2016", "2017")) %>%
  kable_styling("hover", 
                full_width = F) %>%
  row_spec(c(1,7,11), 
           bold = T, 
           hline_after = T ) 
```


Column {.tabset data-width=500}
-----------------------------------------------------------------------
### Giving Amount

```{r}
giving <- 
  read_csv("Data/External_Data/NSiB_Figure2_Table.csv") %>%
  select(!1)
```

```{r}
ggplotly(
  giving %>%
    filter(Year >2008) %>%
    ggplot(aes(x=Year,
               y =value, 
               fill = Contributions)) +
    geom_bar(position = "dodge", 
             stat = "identity") +
    scale_y_continuous(expand = c(0, 0), 
                       limits = c(0,460), 
                       breaks = seq(200,450,50)) +
    scale_x_continuous(breaks = 2008:2018)+
    theme(axis.line = element_blank(),
     #   axis.text.x = element_blank(),
      #   axis.ticks.y = element_blank(),
          axis.ticks.x = element_blank(),
          panel.grid.major.y = element_blank(),
          panel.grid.minor.y = element_blank(),
          panel.grid.major.x = element_line(color = "gray60",
                                            size = 0.8, 
                                            linetype = "dashed")
          ) +
    labs(x = "",
         y = "") +
    coord_flip() #+
 #   theme(legend.position="right", legend.direction = "vertical")
)  %>% 
  layout(legend = list(orientation = "h", 
                       x = 0.12, 
                       y = -0.1), 
         hoverlabel = list(bgcolor = "white"))
```

### Giving by Charity Type
```{r}
giving_charity <- 
  read_csv("Data/External_Data/NSiB_Table5.csv", 
           locale=locale(encoding="latin1")) %>%
  select(!1)

names(giving_charity)[4] <- "%point changes"

giving_charity[3,4] = 0.2
giving_charity[5,4] = 0.3
giving_charity[7,4] = 0.3

```

```{r}
datatable(giving_charity, 
          extensions = c('FixedHeader'),
          rownames = FALSE , 
          options = list(dom='Bfrtip',
                         autoWidth = TRUE, 
                         pageLength=15, 
                         buttons=c('print', 'csv', 'pdf'), 
                         fixedHeader =TRUE))
```


### Total Grants 
```{r}
grant <- 
  read_csv("Data/External_Data/NSiB_Figure3_Table.csv") %>%
  select(!1) 
```

```{r}
ggplotly(
  grant %>%  
    ggplot(aes(x=Year, 
               y = Constant_Grants)) +
        geom_bar(stat = "identity", 
                 fill = "indianred") +
        scale_y_continuous(expand = c(0, 0), 
                           limits = c(0,85),
                          breaks = c(0, 40, 50, 60, 70, 80)) +
        scale_x_continuous(breaks = 2005:2017)+
        labs(#caption = "The Foundation Center, Foundation Stats (2019)",
             x = "Year",
             y = "Grants made (billions)" ) +
    labs(x = "") +
     theme(#axis.text.y = element_blank(),
         # axis.line = element_blank(),
          axis.ticks.x = element_blank(),
          panel.grid.major.x = element_blank(),
          panel.grid.minor.x = element_blank()
          ) ) %>% 
  layout(hoverlabel = list(bgcolor = "white"))
```

Density Map 
=======================================================================

Column {data-width=500}
-----------------------------------------------------------------------

### 2019 All 501c(3) Nonprofits 

```{r, echo=FALSE}
size_map <- 
  geojsonio::geojson_read(
    "Data/Output_Data/nonprofit2019_size_map.geojson", 
     what = "sp")

pal <- colorBin( "RdPu", #do a space to enhance readability
                domain = size_map$count, 
                bins = c(0, 9680, 17300, 33400, 47100, 180000),
                na.color=NA ) 


# leaf.label <- paste0() # put the label format string here

labels <- 
  sprintf( 
  "%s
Number of Nonprofits: %1.0f
State Population in 2015: %1.0f", size_map$name, size_map$count, size_map$pop_2015 ) %>% lapply(htmltools::HTML) ``` ```{r} leaflet(size_map) %>% # density: per 100,000 setView(-96, 37.8, 4) %>% addProviderTiles("MapBox", options = providerTileOptions( id = "mapbox.light", accessToken = Sys.getenv('MAPBOX_ACCESS_TOKEN'))) %>% addPolygons( fillColor = ~pal(count), weight = 2, opacity = 1, color = "white", dashArray = "3", fillOpacity = 0.7, highlightOptions = highlightOptions( weight = 5, color = "#666", dashArray = "", fillOpacity = 0.7, bringToFront = TRUE), label = labels, labelOptions = labelOptions( style = list("font-weight" = "normal", padding = "3px 8px"), textsize = "15px", direction = "auto")) %>% addLegend(pal = pal, values = ~count, opacity = 0.7, title = "501c(3) Nonprofits in 2019", position = "bottomright") ``` Column {.tabset data-width=500} ----------------------------------------------------------------------- ### 2019 Public Charities ```{r} pc19_size_map <- geojsonio::geojson_read( "Data/Output_Data/pc_nonprofit2019_size_map.geojson", what = "sp") pc_pal <- colorBin("BuGn", domain = pc19_size_map$count, bins = c(0, 2340, 4460, 7830, 12200, 53000), na.color=NA) pc_labels <- sprintf( "%s
Number of Nonprofits: %1.0f
State Population in 2015: %1.0f", pc19_size_map$name, pc19_size_map$count, pc19_size_map$pop_2015) %>% lapply(htmltools::HTML) ``` ```{r} leaflet(pc19_size_map) %>% setView(-96, 37.8, 4) %>% addProviderTiles("MapBox", options = providerTileOptions( id = "mapbox.light", accessToken = Sys.getenv('MAPBOX_ACCESS_TOKEN'))) %>% addPolygons( fillColor = ~pc_pal(count), weight = 2, opacity = 1, color = "white", dashArray = "3", fillOpacity = 0.7, highlightOptions = highlightOptions( weight = 5, color = "#666", dashArray = "", fillOpacity = 0.7, bringToFront = TRUE), label = pc_labels, labelOptions = labelOptions( style = list("font-weight" = "normal", padding = "3px 8px"), textsize = "15px", direction = "auto")) %>% addLegend(pal = pc_pal, values = ~count, opacity = 0.7, title = "Public Charity in 2019", position = "bottomright") ``` ### 2019 Private Foundations ```{r} pf19_size_map <- geojsonio::geojson_read( "Data/Output_Data/pf_nonprofit2019_size_map.geojson", what = "sp") pf_pal <- colorBin("BuPu", domain = pf19_size_map$count, bins = c(0, 312, 633, 1100, 1850, 8400), na.color=NA) pf_labels <- sprintf( "%s
Number of Nonprofits: %1.0f
State Population in 2015: %1.0f", pf19_size_map$name, pf19_size_map$count, pf19_size_map$pop_2015) %>% lapply(htmltools::HTML) ``` ```{r} leaflet(pf19_size_map) %>% setView(-96, 37.8, 4) %>% addProviderTiles("MapBox", options = providerTileOptions( id = "mapbox.light", accessToken = Sys.getenv('MAPBOX_ACCESS_TOKEN'))) %>% addPolygons( fillColor = ~pf_pal(count), weight = 2, opacity = 1, color = "white", dashArray = "3", fillOpacity = 0.7, highlightOptions = highlightOptions( weight = 5, color = "#666", dashArray = "", fillOpacity = 0.7, bringToFront = TRUE), label = pf_labels, labelOptions = labelOptions( style = list("font-weight" = "normal", padding = "3px 8px"), textsize = "15px", direction = "auto")) %>% addLegend(pal = pf_pal, values = ~count, opacity = 0.7, title = "Private Foundation in 2019", position = "bottomright") ```